package com.xiaodeng.xdblogspringboot.exception;

import com.xiaodeng.xdblogspringboot.pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class GlobalExceptionHandler {
    // 捕获所有异常
    @ExceptionHandler(Exception.class)
    public Result exceptionHandler(Exception e) {
        // 打印异常的堆栈跟踪信息到控制台
        e.printStackTrace();
        // 返回一个 Result 对象，包含异常信息或默认的操作失败信息
        return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败");
    }
    @ExceptionHandler(UserTokenException.class)
    public Result userTokenException(UserTokenException e) {
        // 打印异常的堆栈跟踪信息到控制台
        e.printStackTrace();
        // 返回一个 Result 对象，包含异常信息或默认的操作失败信息
        return Result.error(e.getMessage());
    }

    // 捕获方法参数验证失败的异常
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public Result methodArgumentNotValidException(Exception e) {
        // 打印异常的堆栈跟踪信息到控制台
        e.printStackTrace();
        // 返回一个 Result 对象，包含异常信息或默认的操作失败信息
        return Result.error(StringUtils.hasLength(e.getMessage()) ? e.getMessage() : "操作失败");
    }

    // 捕获自定义的 UserException 异常
    @ExceptionHandler(UserException.class)
    public Result userexceptionHandler(UserException e) {
        // 调用 UserException 的方法返回相应的 Result 对象
        return e.userexception();
    }

    // 捕获自定义的 ArticleException 异常
    @ExceptionHandler(ArticleException.class)
    public Result articleExceptionHandler(ArticleException e) {
        // 调用 ArticleException 的方法返回相应的 Result 对象
        return e.articleException();
    }
    // 捕获自定义的 ApplicationException 异常
    @ExceptionHandler(ApplicationException.class)
    public Result applicationExceptionHandler(ApplicationException e) {
        // 调用 ApplicationException 的方法返回相应的 Result 对象
        return e.applicationException();
    }
}
